Amazon Lambda
できること
イベントソースからイベント発生毎に実行
S3や他のサービスへの自由なアクセス(権限設定次第)
費用
3,200,000 秒のコンピューティング時間は無料
動かしっぱなしで37日分が無料(1アカウント内の合計)
2分毎に30秒起動すると、1ヶ月で648,000秒。無料枠の20%を利用する計算
はまったこと
時刻はUTCで扱うように統一しておくとよい
code:python
from datetime import datetime, timezone, timedelta
JST = timezone(timedelta(hours=9), name='JST')
NOW = datetime.now(timezone.utc)
date_utc = NOW.strftime('%Y-%m-%dT%H:%M:%SZ')
date_jst = NOW.astimezone(JST).strftime('%Y-%m-%d %H:%M:%S')
環境変数にTZを指定しておく
code:shell
TZ=Asia/Tokyo
これがないと、なぜか datetime.now(timezone.utc) の結果が1時間ずれてしまった
グローバル変数はスクリプト実行ごとには更新されない
code:python
NOW = datetime.now(timezone.utc)
こんなグローバル変数があると、Lambdaの実行環境が生きてる間は更新されない
でもグローバル変数で持っておきたい値ってあるよね?
対策として、グローバル変数を更新するようにした・・
code:python
NOW = datetime.now(timezone.utc)
def update_global_variables():
global NOW
NOW = datetime.now(timezone.utc)
def lambda_handler(event, context):
update_global_variables()
...
実行中にエラーが発生すると、自動的に2回リトライされる
Slack通知など、ユーザーに見える処理が行われる場合、合計3回通知が来たりする
lambda_hander 関数内のエラーをtry/exceptで捕まえてハンドリングする
タイミングによって、同じSlack通知が2回くる
進捗共有ツールで「更新があった」判定を過去N分としたため、バッチのタイミング次第でかぶった やはりステータスをストレージ保存するのは必要